Only sort deps in build script dependency generation
authorAlex Crichton <alex@alexcrichton.com>
Tue, 16 May 2017 15:11:23 +0000 (08:11 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Thu, 18 May 2017 16:45:24 +0000 (09:45 -0700)
src/cargo/core/resolver/mod.rs
src/cargo/ops/cargo_rustc/context.rs
src/cargo/ops/cargo_rustc/custom_build.rs
src/cargo/ops/cargo_rustc/mod.rs
tests/build-script.rs
tests/build.rs

index 1a3e217bf58206a640ca21bbd9f87ae17ed15949..896b280469e6fea9c04dd02ef1cb518d4ae779bc 100644 (file)
@@ -200,12 +200,6 @@ unable to verify that `{0}` is the same as when the lockfile was generated
         Deps { edges: self.graph.edges(pkg), resolve: self }
     }
 
-    pub fn deps_sorted(&self, pkg: &PackageId) -> Vec<&PackageId> {
-        let mut deps = self.deps(pkg).collect::<Vec<_>>();
-        deps.sort();
-        deps
-    }
-
     pub fn deps_not_replaced(&self, pkg: &PackageId) -> DepsNotReplaced {
         DepsNotReplaced { edges: self.graph.edges(pkg) }
     }
index 49565ad9fe28f9eea6d3437a67776dea3123dc35..e17a0823b6c0e220098bab5b6eecccfa48970dd9 100644 (file)
@@ -614,8 +614,8 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
         }
 
         let id = unit.pkg.package_id();
-        let deps = self.resolve.deps_sorted(id);
-        let mut ret = deps.iter().filter(|dep| {
+        let deps = self.resolve.deps(id);
+        let mut ret = deps.filter(|dep| {
             unit.pkg.dependencies().iter().filter(|d| {
                 d.name() == dep.name() && d.version_req().matches(dep.version())
             }).any(|d| {
@@ -748,8 +748,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
 
     /// Returns the dependencies necessary to document a package
     fn doc_deps(&self, unit: &Unit<'a>) -> CargoResult<Vec<Unit<'a>>> {
-        let deps = self.resolve.deps_sorted(unit.pkg.package_id());
-        let deps = deps.iter().filter(|dep| {
+        let deps = self.resolve.deps(unit.pkg.package_id()).filter(|dep| {
             unit.pkg.dependencies().iter().filter(|d| {
                 d.name() == dep.name()
             }).any(|dep| {
index 64f05f918e891fd9550d181faade997436273e80..930662151e75d5572e8d1c8ac775335731d78d62 100644 (file)
@@ -464,7 +464,15 @@ pub fn build_map<'b, 'cfg>(cx: &mut Context<'b, 'cfg>,
         if !unit.target.is_custom_build() && unit.pkg.has_custom_build() {
             add_to_link(&mut ret, unit.pkg.package_id(), unit.kind);
         }
-        for unit in cx.dep_targets(unit)?.iter() {
+
+        // We want to invoke the compiler deterministically to be cache-friendly
+        // to rustc invocation caching schemes, so be sure to generate the same
+        // set of build script dependency orderings via sorting the targets that
+        // come out of the `Context`.
+        let mut targets = cx.dep_targets(unit)?;
+        targets.sort_by_key(|u| u.pkg.package_id());
+
+        for unit in targets.iter() {
             let dep_scripts = build(out, cx, unit)?;
 
             if unit.target.for_host() {
index 40c53731f24497316d9e9437f6cc244f5cd99b09..c827887948fe6867cab89dbc1e927257dd8c49b9 100644 (file)
@@ -770,6 +770,9 @@ fn build_base_args(cx: &mut Context,
         cmd.arg("--cfg").arg("test");
     }
 
+    // We ideally want deterministic invocations of rustc to ensure that
+    // rustc-caching strategies like sccache are able to cache more, so sort the
+    // feature list here.
     for feat in cx.resolve.features_sorted(unit.pkg.package_id()) {
         cmd.arg("--cfg").arg(&format!("feature=\"{}\"", feat));
     }
index da2a45649cdab0c300ba17012da072c7ec53cef2..d07eefe694872f0ef55c570632d01834f93e88a6 100644 (file)
@@ -2678,30 +2678,8 @@ fn deterministic_rustc_dependency_flags() {
 
     assert_that(p.cargo_process("build").arg("-v"),
                 execs().with_status(0)
-                    .with_stderr("\
-[UPDATING] [..]
-[DOWNLOADING] [..]
-[DOWNLOADING] [..]
-[DOWNLOADING] [..]
-[DOWNLOADING] [..]
-[COMPILING] [..]
-[COMPILING] [..]
-[COMPILING] [..]
-[COMPILING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[RUNNING] [..]
-[COMPILING] foo v0.1.0 [..]
+                    .with_stderr_contains("\
 [RUNNING] `rustc --crate-name foo [..] -L native=test1 -L native=test2 \
 -L native=test3 -L native=test4`
-[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]"));
+"));
 }
index e4cbfff20fdc6b020658093efd2ee128597034e8..fc4d289832b443b76c9e8d41970cb67470f69ab5 100644 (file)
@@ -3182,8 +3182,8 @@ fn deterministic_cfg_flags() {
 [RUNNING] [..]
 [RUNNING] [..]
 [RUNNING] `rustc --crate-name foo [..] \
---cfg 'feature=\"default\"' --cfg 'feature=\"f_a\"' --cfg 'feature=\"f_b\"' \
---cfg 'feature=\"f_c\"' --cfg 'feature=\"f_d\"' [..] \
+--cfg[..]default[..]--cfg[..]f_a[..]--cfg[..]f_b[..]\
+--cfg[..]f_c[..]--cfg[..]f_d[..] \
 --cfg cfg_a --cfg cfg_b --cfg cfg_c --cfg cfg_d --cfg cfg_e`
 [FINISHED] dev [unoptimized + debuginfo] target(s) in [..]"));
 }